iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
0
Modern Web

【這些年我似是非懂的 Javascript】系列 第 28

【這些年我似是非懂的 Javascript】Day 28 - 物件 # Part 4 # 特性描述器 Combo

  • 分享至 

  • xImage
  •  

昨天分享了特性組合的一般單獨的使用方法,
今天要來分享一下他們的 Combo 連技和相關用到的東西。

物件常數 (Object constant)

writableconfigurable 都設定成 false,就可以建立出一個不能修改也不能被變更的物件常數。

const obj = {}; // 給個空物件

Object.defineProperty(obj,"a",{
    value: 17,
    writable: false,
    enumerable: true,
    configurable: false
});

obj.a; // 17  出現啦~
obj.a = 123;
obj.a; // 17 // 改不了啊!!!!

Object.defineProperty(obj,"a",{
    value: 17,
    writable: true,
    enumerable: true,
    configurable: true
}); // TypeError 改不了啊!!!!

避免擴充 (Prevent extensions)

如果你想要避免這個 Object 被新增額外的特性怎麼辦?
登登登登登~
你可以使用 Object.preventExtensions(..)

const obj ={
    a:17
};

Object.preventExtensions(obj);

obj.b = 123;
obj.b; // undefined

假使是非嚴格模式它就默默地失敗了,但如果是嚴格模式他就會噴你 TypeError

密封 (Seal)

如何建立一個密封過的物件呢?
什麼意思!? 就是你不准新增任何的特性也不可以刪除既有的特性,但是你唯一能做的事就是修改他的值。
Object.seal(..),基本上這個就是你丟進去一個Object ,他就幫你呼叫剛剛提的 Object.preventExtensions(..) 和設定configurablefalse

const obj = {
    a:17
};

Object.seal(obj);

obj.b = 123;
obj.b; // undefined 不能增加特性

Object.defineProperty(obj,"a",{
    value: 16,
    writable: true,
    enumerable: true,
    configurable: true
}); // TypeError 不給改啊!!!

obj.a = 123;
obj.a; // 123 可以改~

凍結 (Freeze)

不准新增刪除和重新配置該特性,也不能更改值。
基本上就是 Object.seal + writable: false

const obj = {
    a:17,
};

Object.freeze(obj);

obj.b = 123;
obj.b; // undefined 不能增加特性

Object.defineProperty(obj,"a",{
    value: 16,
    writable: true,
    enumerable: true,
    configurable: true
}); // TypeError 不給改啊!!!

obj.a = 777;
obj.a; // 17 也不給改啊!!!

你剩下能做的大概就只剩讀取他和對他迭代。

以上是今天的內容

明天倒數兩天啦啦啦!
看起來要讀完這本是涼了xDD
不過物件這章節應該可以結束。
明天主要會講特性的存取一些眉眉角角~
"可能"還有迭代 xD~

感謝您的收看
我們明天見


參考來源:

你所不知道的 JS|範疇與 Closures,this 與物件原型 (You Don't Know JS: this & Object Prototypes))


上一篇
【這些年我似是非懂的 Javascript】Day 27 - 物件 # Part 3 # 特性描述器
下一篇
【這些年我似是非懂的 Javascript】Day 29 - 物件 # Part 5 # 特性存取的秘密
系列文
【這些年我似是非懂的 Javascript】34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言